//package com.jen.config;
//
//
//import com.jen.service.RabbitSendService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.core.Message;
//import org.springframework.amqp.rabbit.connection.CorrelationData;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.PostConstruct;
//import java.util.Objects;
//
///**
// * @ClassName WatchMessageImpl
// * @Description 消息监控和到达队列的监控
// * @Date 2021/10/19 16:55
// * @Author Rick Jen
// */
//@Component
//@Slf4j
//public class WatchMessageImpl implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {
//
//    @Autowired
//    private RabbitTemplate rabbitTemplate;
//    @Autowired
//    private RabbitSendService rabbitSendService;
//
//    @PostConstruct
//    private void initRabbitTemplate() {
//        this.rabbitTemplate.setConfirmCallback(this);
//        this.rabbitTemplate.setReturnCallback(this);
//    }
//
//    /**
//     * 消息到达交换机的回调
//     *
//     * @param correlationData
//     * @param ack             是否到达交换机
//     * @param cause           如果没有接收成功，返回拒绝的原因
//     */
//    @Override
//    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//        if (ack) {
//            log.info("交换机接收消息成功");
//        } else {
//            log.error("交换机接收消息失败，失败原因为：{}", cause);
//        }
//    }
//
//    /**
//     * 当消息到达队列失败时，回调的方法，消息被退回了，我们可以把消息记录下来，分析错误的原因，以后重新发送，这样的话，消息就不会再丢失了
//     *
//     * @param message    消息体
//     * @param replyCode  回退的响应码
//     * @param replyText  响应文本
//     * @param exchange   该消息来自哪个交换机
//     * @param routingKey 该消息的路由key
//     */
//    @Override
//    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
//        log.error("到达队列失败，消息内容：{}", new String(message.getBody()));
//        log.error("回退的响应码：{}，响应文本：{}，交换机为：{}，路由key为：{}", replyCode, replyText, exchange, routingKey);
//        // 处理重新发送的问题
////        if (message.getMessageProperties().getExpiration() != null && !Objects.equals(message.getMessageProperties().getExpiration(), "")){
//        if (message.getMessageProperties().getReceivedDelay() != null){
//            // 重新发送延时消息
//            log.error("重新发送延时消息：{}", new String(message.getBody()));
//            rabbitSendService.sendOtherDelayMessage(exchange, routingKey, Long.valueOf(message.getMessageProperties().getReceivedDelay()),new String(message.getBody()));
//        }else {
//            // 重新发送消息
//            log.error("重新发送消息：{}", new String(message.getBody()));
//            rabbitSendService.sendMessage(exchange, routingKey, new String(message.getBody()));
//        }
//    }
//}
